Asociace souboru s MDI aplikaci
Otázka od: Jiri Foldyna
6. 10. 2004 11:33
Ahoj,
omlouvam se za asi neprilis vystizny subj, ale jde v podstate o toto:
Mam MDI aplikaci, ktera je asociovana z urcitym typem souboru. Po poklepani
na soubor napr. v pruzkumniku se spusti aplikace a otevre se okno se
souborem. Potreboval bych ale, aby se v pripade, ze aplikace uz bezi,
nespoustela dalsi instance, ale aby se v bezici aplikaci otevrelo dalsi
okno. Zjistit, jestli uz aplikace bezi, neni problem. Co potrebuji, je
predat bezici aplikaci nazev souboru. Jak to resite ?
Diky
Jiri Foldyna
Odpovedá: Ing. Petr Sikola
6. 10. 2004 12:15
ja to delam pres message wm_copydata
kde si v aplikaci (jeste v *.dpr) zjistim jestli je jiz spustena jina
instance, a pokud ano, posilam mesage do te drive spustene, pokud ne,
nic neposilam.
v te drive spustene si wm_copydata odchytnu a prectu si z ni jmena
souboru.
Petr Sikola
> souborem. Potreboval bych ale, aby se v pripade, ze aplikace uz bezi,
> nespoustela dalsi instance, ale aby se v bezici aplikaci
> otevrelo dalsi
> okno. Zjistit, jestli uz aplikace bezi, neni problem. Co potrebuji, je
> predat bezici aplikaci nazev souboru. Jak to resite ?
> Jiri Foldyna
Odpovedá: Jan Rizek
6. 10. 2004 12:36
Tohle jsem nikdy neresil, ale slo by ho zapsat do souboru a z nej si to
precist.. (ShellChangeNotifier) .
> Ahoj,
>
> omlouvam se za asi neprilis vystizny subj, ale jde v podstate o toto:
>
> Mam MDI aplikaci, ktera je asociovana z urcitym typem souboru. Po
poklepani
> na soubor napr. v pruzkumniku se spusti aplikace a otevre se okno se
> souborem. Potreboval bych ale, aby se v pripade, ze aplikace uz bezi,
> nespoustela dalsi instance, ale aby se v bezici aplikaci otevrelo dalsi
> okno. Zjistit, jestli uz aplikace bezi, neni problem. Co potrebuji, je
> predat bezici aplikaci nazev souboru. Jak to resite ?
>
> Diky
>
> Jiri Foldyna
>
>
>
>
>
Odpovedá: Ondrej Kelle
6. 10. 2004 12:17
> Mam MDI aplikaci, ktera je asociovana z urcitym typem
> souboru. Po poklepani na soubor napr. v pruzkumniku
> se spusti aplikace a otevre se okno se souborem.
> Potreboval bych ale, aby se v pripade, ze aplikace uz
> bezi, nespoustela dalsi instance, ale aby se v bezici
> aplikaci otevrelo dalsi okno. Zjistit, jestli uz
> aplikace bezi, neni problem. Co potrebuji, je predat
> bezici aplikaci nazev souboru. Jak to resite ?
program MyApp;
uses
Forms,
JclAppInst,
...;
const
MyAppUniqueID = ...; // napriklad GUID
begin
with JclAppInstances(MyAppUniqueID) do
if CheckInstance(1) then
begin
Application.Initialize;
Application.Title := ...;
Application.CreateForm(TMyAppMainForm, MyAppMainForm);
Application.Run;
end
else
begin
SwitchTo(0);
SendCmdLineParams('TMyAppMainForm', 0);
end;
end.
HTH
TOndrej
Odpovedá: Ondrej Kelle
6. 10. 2004 12:31
>> Mam MDI aplikaci, ktera je asociovana z urcitym typem
>> souboru. Po poklepani na soubor napr. v pruzkumniku
>> se spusti aplikace a otevre se okno se souborem.
>> Potreboval bych ale, aby se v pripade, ze aplikace uz
>> bezi, nespoustela dalsi instance, ale aby se v bezici
>> aplikaci otevrelo dalsi okno. Zjistit, jestli uz
>> aplikace bezi, neni problem. Co potrebuji, je predat
>> bezici aplikaci nazev souboru. Jak to resite ?
Ospravedlnujem sa, moj predosly prispevok nebol uplny.
Ten kod v .dpr posle prvej instancii spravu WM_COPYDATA, takze v hlavnom
formulari aplikacie treba tuto spravu osetrit:
procedure TMyAppMainForm.WMCopyData(var Message: TWMCopyData);
var
S: string;
Strings: TStringList;
I: Integer;
begin
with Message do
if (From = 0) and Assigned(CopyDataStruct) and (CopyDataStruct^.dwData =
AppInstCmdLineDataKind) and
(CopyDataStruct^.cbData > 0) then
begin
Strings := TStringList.Create;
try
with CopyDataStruct^ do
SetString(S, PChar(lpData), cbData);
Strings.Text := S;
for I := 0 to Strings.Count - 1 do
OpenFile(Strings[I]);
finally
Strings.Free;
end;
end;
end;
OpenFile potom kontroluje, ci pre dane meno suboru uz existuje otvorene MDI
child okno; ak ano, len ho nastavi ho do popredia, inak vytvori nove okno.
HTH
TOndrej
Odpovedá: Jiri Foldyna
6. 10. 2004 18:11
Diky vsem, vyzkousim.
Jiri Foldyna
> procedure TMyAppMainForm.WMCopyData(var Message: TWMCopyData);
> var
> S: string;
> Strings: TStringList;
> I: Integer;
> begin
> with Message do
> if (From = 0) and Assigned(CopyDataStruct) and
> (CopyDataStruct^.dwData =
> AppInstCmdLineDataKind) and
> (CopyDataStruct^.cbData > 0) then
> begin
> Strings := TStringList.Create;
> try
> with CopyDataStruct^ do
> SetString(S, PChar(lpData), cbData);
> Strings.Text := S;
> for I := 0 to Strings.Count - 1 do
> OpenFile(Strings[I]);
> finally
> Strings.Free;
> end;
> end;
> end;
>
> OpenFile potom kontroluje, ci pre dane meno suboru uz
> existuje otvorene MDI
> child okno; ak ano, len ho nastavi ho do popredia, inak
> vytvori nove okno.
>
> HTH
> TOndrej
>
>
>